大数的运算(加减乘除)C代码

  题目:一般数的加减乘除很好计算,如果超过了8为数,那么int就无能为力了。以前老是让做过大数的加法,但那时年少无知,没有去做,貌似当时的作业都没完成。这几天心血来潮,对着个问题有感兴趣。当然这是编程路上必须走的路。下面就献上我的代码。

分析:

       大数的运算,说大数,那就不能用简单的数据类型能解决的。我想到的是用数组存储数据。

       大概思路:说先义字符的形式把数输入到数组中,然后在将字符数组转换成整型的。然后对这些书进行操作。

比较大小:这个简单,把数组的每一位(从高到低)进行比较就行了。

 加法:将每一位进行相加,有进位的进行进位,后面相加时要加上进位。没有进位的直接就加起来。如果位数相等,直接相加就好了,如果位数不等,则把多余的部分直接放在结果中。
 加法:从最低位开始,将每以为相对的进行相减,如果见不过还要向前面借位。

除法和乘法还没做完,以后补上。

 代码不够简洁,有更好的代码的,可以拿来进行分享。

下面就是代码:

#define MAX 1000
#include<stdio.h>
void add(int *a,int *b,int nNuma,int nNumb);
void plus(int *a,int *b,int nNuma,int nNumb);
bool compare(int *a,int *b,int nNuma,int nNumb);
int main()
{
 int nNuma,nNumb;
 nNuma=0; nNumb=0;
 int i;
 char c1,c2;
 char a1[MAX],b1[MAX];
 int a[MAX],b[MAX];
 printf("请输入第一个数\n");
 for(i=0;;i++)
 {  
  nNuma++;
  scanf("%c",&c1);
  a1[i]=c1;
  if(c1=='\n')
  {  nNuma--;
	  break;
  }
 }
 printf("请输入第二个数\n");
 for(i=0;;i++)
 { 
  nNumb++;
  scanf("%c",&c2);
  b1[i]=c2;
  if(c2=='\n')
  {  nNumb--;
	  break;
  }
 }
 for(i=0;i<nNuma;i++)
 {
   a[i]=a1[i]-'0';
 }
 for(i=0;i<nNumb;i++)
 {
   b[i]=b1[i]-'0';
 }

 add(a,b,nNuma,nNumb);
 if(compare(a,b,nNuma,nNumb))
   printf("a>=b\n");
 else 
   printf("a<b\n");
 plus(a,b,nNuma,nNumb);
 return 0;

}
//大数减法
void plus(int *a,int *b,int nNuma,int nNumb)
{   int i,h; 
    int k=0;
	int c[MAX];
	//int ma[MAX];
    int na,nb;
	int *ma;
	int *mb;
	na=nNuma;
	nb=nNumb;
	ma=a;
	mb=b;
 if(!compare(a,b,nNuma,nNumb))
 { 
   ma=b;
   mb=a;
   na=nNumb;
   nb=nNuma;
 }
  
 for(;nb-1>=0;na--,nb--) 
 {
	 if(ma[na-1]<mb[nb-1])
	 {
	   ma[na-2]--;
	    h=10;
	 }
	 else 
		h=0;
	 
	 c[k]=ma[na-1]-mb[nb-1]+h;   //h为借位
	 k++;
 } 
 if(ma[na-1]<mb[nb-1])
 {
   ma[na-2]--;
   h=10;
 }
  else 
    h=0;
 if(na-1>=0)
 {
     for(i=nb-1;i>=0;k++,i--)
	   c[k]=ma[i];
 }
 printf("差为:  ");
 if(!compare(a,b,nNuma,nNumb));
 else
  printf("-");
 for(int j=k-1;j>=0;j--)
	 printf("%d",c[j]);
     printf("\n");


 
}
//大数加法
void add(int *a,int *b,int nNuma,int nNumb)
{
  int i,h,t; h=0;
  int k=0;
  int c[MAX];
  int na=nNuma;
  int nb=nNumb;
 for(;na-1>=0&&nb-1>=0;na--,nb--)
  {
	  t=a[na-1]+b[nb-1]+h;
      c[k]=t%10;
      h=t/10;
	  k++;
  }
 if(t>=10)
	h=t/10;
 else
	 h=0;
 if(na==nb)
 {
  c[k]=h;k++;
 }
 if(na-1>=0)
 {
   for(i=na-1;i>=0;k++,i--)
   {  c[k]=a[i]+h;
      h=0;  }
 }

 if(nb-1>=0)
 {  
   for(i=nb-1;i>=0;k++,i--)
   {  c[k]=b[i]+h;  
      h=0;
   }
 }
 printf("差为:  ");
  for(int j=k-1;j>=0;j--)
	 printf("%d",c[j]);
     printf("\n");

}
bool compare(int *a,int *b,int nNuma,int nNumb)
{
  int i=0;
  bool sign;
  int na=nNuma;
  int nb=nNumb;
 if(na>nb)
  sign=true;
 else if(na==nb)
 { while(a[i]==b[i])
    i++; 
 if(a[i]<b[i])  sign=false;   //a[]小于b[]
 else   sign=true; 
 }

 else if(na<nb)   //nb>na
  sign=false;
 return sign;
}


  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用以下代码:#include <stdio.h>int main() { int a, b; int result; char op; printf("输入第一个数字:"); scanf("%d", &a); printf("输入第二个数字:"); scanf("%d", &b); printf("输入运算符:"); scanf(" %c", &op); switch (op) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': result = a / b; break; default: printf("无效的运算符!\n"); break; } printf("运算结果:%d\n", result); return 0; } ### 回答2: 下面是用C语言实现输入两个大数进行乘除运算并输出结果的代码: ```c #include <stdio.h> #include <string.h> #define MAX_LENGTH 100 // 假设大数的最大长度为100 // 大数 char* add(char* num1, char* num2) { static char result[MAX_LENGTH + 1]; memset(result, '0', MAX_LENGTH + 1); int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 > len2 ? len1 : len2; int carry = 0; for (int i = 0; i < len; i++) { int sum = (i < len1 ? num1[len1 - 1 - i] - '0' : 0) + (i < len2 ? num2[len2 - 1 - i] - '0' : 0) + carry; carry = sum / 10; result[MAX_LENGTH - i] = sum % 10 + '0'; } if (carry > 0) { result[MAX_LENGTH - len - 1] = carry + '0'; } return result + (result[0] == '0' ? 1 : 0); } // 大数 char* subtract(char* num1, char* num2) { static char result[MAX_LENGTH + 1]; memset(result, '0', MAX_LENGTH + 1); int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 > len2 ? len1 : len2; int borrow = 0; for (int i = 0; i < len; i++) { int diff = (i < len1 ? num1[len1 - 1 - i] - '0' : 0) - (i < len2 ? num2[len2 - 1 - i] - '0' : 0) - borrow; borrow = diff < 0 ? 1 : 0; result[MAX_LENGTH - i] = diff < 0 ? diff + 10 + '0' : diff + '0'; } return result + (result[0] == '0' ? 1 : 0); } // 大数相乘 char* multiply(char* num1, char* num2) { static char result[MAX_LENGTH + MAX_LENGTH]; memset(result, '0', MAX_LENGTH + MAX_LENGTH); int len1 = strlen(num1); int len2 = strlen(num2); for (int i = 0; i < len1; i++) { int carry = 0; for (int j = 0; j < len2; j++) { int product = (num1[len1 - 1 - i] - '0') * (num2[len2 - 1 - j] - '0') + carry + (result[MAX_LENGTH + MAX_LENGTH - 1 - i - j] - '0'); carry = product / 10; result[MAX_LENGTH + MAX_LENGTH - 1 - i - j] = product % 10 + '0'; } if (carry > 0) { result[MAX_LENGTH + MAX_LENGTH - 1 - i - len2] = carry + '0'; } } return result + (result[0] == '0' ? 1 : 0); } // 大数相除 char* divide(char* num1, char* num2) { static char result[MAX_LENGTH + 1]; memset(result, '0', MAX_LENGTH + 1); int len1 = strlen(num1); int len2 = strlen(num2); if (len2 == 1 && num2[0] == '0') { return "NaN"; // 除数为0,结果为无穷大 } if (len1 < len2 || (len1 == len2 && strcmp(num1, num2) < 0)) { return "0"; // 被除数小于除数,结果为0 } char temp[MAX_LENGTH + 1]; strcpy(temp, num1); for (int i = len1 - len2; i >= 0; i--) { while (strcmp(temp, num2) >= 0) { strcpy(temp, subtract(temp, num2)); result[i]++; } } return result + (result[0] == '0' ? 1 : 0); } int main() { char num1[MAX_LENGTH]; char num2[MAX_LENGTH]; printf("请输入第一个大数:"); scanf("%s", num1); printf("请输入第二个大数:"); scanf("%s", num2); printf("法结果:%s\n", add(num1, num2)); printf("法结果:%s\n", subtract(num1, num2)); printf("乘法结果:%s\n", multiply(num1, num2)); printf("除法结果:%s\n", divide(num1, num2)); return 0; } ``` 这段代码实现了大数法(add)、法(subtract)、乘法(multiply)和除法(divide)运算。用户可以输入两个大数,然后计算并输出它们的、乘、除运算结果。代码使用静态字符数组来保存结果,并返回一个指向结果数组的指针,同时处理结果数组前多余的0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值